跳到主要内容

linux 虚拟机无法访问网络的几个常见问题

在使用虚拟机的时候常常会遇到访问不了互联网的问题,搞来搞去发现问题多出在几个固定的地方,主要是 nameserver 与默认网关配置问题,本文主要针对这些常见的问题点进行描述。

nameserver 配置问题导致域名无法解析

问题的具体现象如下:

[longyu@debian-10:15:17:20] ~ $ ping www.baidu.com
ping: www.baidu.com: Name or service not known

上面的报错信息表明,www.baidu.com 这个域名无法解析找到对应的 ip 地址,ping 失败。

这时我们需要检查 /etc/resolv.conf文件。

正常的 /etc/resolv.conf文件内容的一个示例如下:

# Generated by NetworkManager
nameserver x.x.x.x

nameserver + ip 地址就是其中的一项,这里的 x.x.x.x 是 dns 服务器的地址。有了这个配置,当我们访问某个域名的时候就会从这个 dns 服务器上去获取域名对应的公网 ip。

缺少默认网关配置的问题

一个更常见的问题是机器中缺少默认网关配置。这里提到的默认网关是我们的机器与外界联系的第一道桥梁,本地机器上发送给其它网段的包由默认网关转发到外界。

对于缺少默认网关配置的问题,我们可以通过执行 route命令来添加一个默认网关。

route 命令的执行示例

在我的虚拟机中,执行 route命令有如下输出信息:

Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default _gateway 0.0.0.0 UG 0 0 0 ens8
default _gateway 0.0.0.0 UG 100 0 0 ens3
default _gateway 0.0.0.0 UG 102 0 0 ens9
link-local 0.0.0.0 255.255.0.0 U 1000 0 0 ens3
192.168.122.0 0.0.0.0 255.255.255.0 U 100 0 0 ens3
192.168.122.0 0.0.0.0 255.255.255.0 U 101 0 0 ens8
192.168.122.0 0.0.0.0 255.255.255.0 U 102 0 0 ens9

这里的 0.0.0.0 表示本地机器上的所有 ip 地址。Destination 为 default 的项目就是默认网关的路由配置信息。

下面我使用 ens8 这个接口来演示如何删除、添加路由信息

删除一条路由信息

使用 route命令删除路由信息使用的参数如下:

route  [-v] [-A family |-4|-6] del [-net|-host] target [gw Gw] [netmask Nm] [metric M] [[dev] If]

删除一条默认路由可以执行 route del default [[dev] If]命令。机器上有多个网络端口的情况下,可以通过指定 dev 参数来删除指定端口的默认路由配置。

这里我执行如下命令删除我的虚拟机中 ens8 端口的默认路由信息:

longyu@longyu-pc:~$ sudo route del default ens8

执行成功后,执行 route 命令查询系统中目前的路由表信息如下:

longyu@longyu-pc:~$ sudo route 
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default _gateway 0.0.0.0 UG 100 0 0 ens3
default _gateway 0.0.0.0 UG 102 0 0 ens9
link-local 0.0.0.0 255.255.0.0 U 1000 0 0 ens3
192.168.122.0 0.0.0.0 255.255.255.0 U 100 0 0 ens3
192.168.122.0 0.0.0.0 255.255.255.0 U 101 0 0 ens8
192.168.122.0 0.0.0.0 255.255.255.0 U 102 0 0 ens9

通过上面的信息可以看到 ens8 的默认路由已经被移除。这时候我们使用 ens8 端口来 ping 百度是 ping 不通的,测试输出如下:

longyu@longyu-pc:~$ ping -I ens8 www.baidu.com
PING www.wshifen.com (104.193.88.77) from 192.168.122.202 ens8: 56(84) bytes of data.
^C
--- www.wshifen.com ping statistics ---
12 packets transmitted, 0 received, 100% packet loss, time 274ms

添加一个默认网关的路由信息

在上面的操作中,我们已经删除了 ens8 端口的默认路由配置,这导致我们无法通过 ens8 端口来访问互联网。要恢复正常,我们可以将删除的默认路由添加回来。

route命令添加路由可以通过指定如下参数来完成。

 route  [-v] [-A family |-4|-6] add [-net|-host] target [netmask Nm] [gw Gw] [metric N] [mss M] [window W] [irtt I] [reject] [mod] [dyn] [reinstate] [[dev] If]

给 ens8 端口添加默认路由通过执行如下命令来完成。

longyu@longyu-pc:~$ sudo route add default gw 192.168.122.1 ens8

这里需要注意的是在将 192.168.122.1 设置为默认网关之前,要确保 192.168.122.1 能够被访问到。添加成功后再次执行 route命令有如下输出:

longyu@longyu-pc:~$ sudo route 
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default _gateway 0.0.0.0 UG 0 0 0 ens8
default _gateway 0.0.0.0 UG 100 0 0 ens3
default _gateway 0.0.0.0 UG 101 0 0 ens8
default _gateway 0.0.0.0 UG 102 0 0 ens9
link-local 0.0.0.0 255.255.0.0 U 1000 0 0 ens3
192.168.122.0 0.0.0.0 255.255.255.0 U 100 0 0 ens3
192.168.122.0 0.0.0.0 255.255.255.0 U 101 0 0 ens8
192.168.122.0 0.0.0.0 255.255.255.0 U 102 0 0 ens9

可以看到,默认网关的路由信息已经添加了回来,再次通过 ens8 ping 百度有如下输出:

longyu@longyu-pc:~$ ping -I ens8 www.baidu.com
PING www.wshifen.com (104.193.88.123) from 192.168.122.202 ens8: 56(84) bytes of data.
64 bytes from 104.193.88.123 (104.193.88.123): icmp_seq=1 ttl=45 time=267 ms
64 bytes from 104.193.88.123 (104.193.88.123): icmp_seq=2 ttl=45 time=267 ms
64 bytes from 104.193.88.123 (104.193.88.123): icmp_seq=3 ttl=45 time=270 ms
^C
--- www.wshifen.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 5ms
rtt min/avg/max/mdev = 266.688/268.135/270.384/1.666 ms

从上面的信息可以看到,我们已经可以通过 ens8 端口访问到互联网了。

openEuler 系统安装后无法访问互联网

前段时间安装了 openEuler 系统后发现无法访问互联网,排查了 dns 与默认网关都是正常的。

关闭 selinux、防火墙之后重试仍旧有相同的问题。最后发现需要修改 /etc/sysconfig/network-scripts/ifcfg-xxx 中的接口配置,将 ONBOOT=no 修改为 ONBOOT=yes 即可解决问题。

排查网络接口驱动侧问题的一般思路

也曾经遇到过网络接口驱动问题导致无法访问网络的情况,遇到这种问题一般可以查看以下几个点的信息:

  1. ifconfig xxx 查看接口是否 RUNNING 且收发包统计是否正常
  2. ethtool xxx 查看接口 Link detected 是否为 yes
  3. ethtool -S xxx 查看接口收发包统计是否正常及是否有异常统计增加
  4. 查看 dmesg 信息观察是否有相关的 oops 信息
  5. 对于 pci 网卡,使用 lspci 命令排查是否硬件故障

常见问题的恢复可以参考如下步骤:

  1. 执行一次接口 down、up
  2. 解绑驱动后重新绑定网卡接口
  3. 重启机器